{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#创建试验样本数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "希望你在学习本书时用自己的数据来试验，如果实在没有数据，下面就介绍如何用scikit-learn创建一些试验用的样本数据（toy data）。\n",
    "\n",
    "<!-- TEASER_END -->"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##Getting ready"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "与前面获取内置数据集，获取新数据集的过程类似，创建样本数据集，用`make_数据集名称`函数。这些数据集都是人造的："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn import datasets\n",
    "\n",
    "datasets.make_*?"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "datasets.make_biclusters\n",
    "datasets.make_blobs\n",
    "datasets.make_checkerboard\n",
    "datasets.make_circles\n",
    "datasets.make_classification\n",
    "datasets.make_friedman1\n",
    "datasets.make_friedman2\n",
    "datasets.make_friedman3\n",
    "datasets.make_gaussian_quantiles\n",
    "datasets.make_hastie_10_2\n",
    "datasets.make_low_rank_matrix\n",
    "datasets.make_moons\n",
    "datasets.make_multilabel_classification\n",
    "datasets.make_regression\n",
    "datasets.make_s_curve\n",
    "datasets.make_sparse_coded_signal\n",
    "datasets.make_sparse_spd_matrix\n",
    "datasets.make_sparse_uncorrelated\n",
    "datasets.make_spd_matrix\n",
    "datasets.make_swiss_roll\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为了简便，下面我们用`d`表示`datasets`，`np`表示`numpy`："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import sklearn.datasets as d\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##How to do it..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这一节将带你创建几个数据集；在后面的*How it works...*一节，我们会检验这些数据集的特性。除了样本数据集，后面还会创建一些具有特定属性的数据集来显示算法的特点。\n",
    "\n",
    "首先，我们创建回归（regression）数据集："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((100, 100), (100,))"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg_data = d.make_regression()\n",
    "reg_data[0].shape,reg_data[1].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`reg_data`默认是一个元组，第一个元素是$100\\times100$的矩阵——100个样本，每个样本10个特征（自变量），第二个元素是1个因变量，对应自变量的样本数量，也是100个样本。然而，默认情况下，只有10个特征与因变量的相关（参数`n_informative`默认值是10），其他90个特征都与。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以自定义更复杂的数据集。比如，创建一个$1000\\times10$的矩阵，5个特征与因变量相关，误差系数0.2，两个因变量。代码如下所示："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((1000, 10), (1000, 2))"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "complex_reg_data = d.make_regression(1000, 10, 5, 2, 1.0)\n",
    "complex_reg_data[0].shape,complex_reg_data[1].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "分类数据集也很容易创建。很容易创建一个基本均衡分类集，但是这种情况现实中几乎不可能发生——大多数用户不会改变消费习惯，大多数交易都不是虚假的，等等。因此，创建一个非均衡数据集更有意义："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([10, 90], dtype=int64)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "classification_set = d.make_classification(weights=[0.1])\n",
    "np.bincount(classification_set[1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "聚类数据集也可以创建。有一些函数可以为不同聚类算法创建对应的数据集。例如，`blobs`函数可以轻松创建K-Means聚类数据集："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x88e44e0>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x73e5908>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import sklearn.datasets as d\n",
    "from matplotlib import pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "blobs = d.make_blobs(200)\n",
    "\n",
    "f = plt.figure(figsize=(8, 4))\n",
    "\n",
    "ax = f.add_subplot(111)\n",
    "ax.set_title(\"A blob with 3 centers\")\n",
    "\n",
    "colors = np.array(['r', 'g', 'b'])\n",
    "ax.scatter(blobs[0][:, 0], blobs[0][:, 1], color=colors[blobs[1].astype(int)], alpha=0.75)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "##How it works..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "下面让我们从源代码看看scikit-learn是如何生成回归数据集的。下面任何未重新定义的参数都使用`make_regression`函数的默认值。\n",
    "\n",
    "其实非常简单。首先，函数调用时生成一个指定维度的随机数组。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "X = np.random.randn(n_samples, n_features)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于基本均衡数据集，其目标数据集生成方法是："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "ground_truth = np.zeroes((np_samples, n_target))\n",
    "ground_truth[:n_informative, :] = 100*np.random.rand(n_informative,\n",
    "n_targets)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "然后`X`和`ground_truth`点积加上`bias`就得到了`y`："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y = np.dot(X, ground_truth) + bias"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    ">点积是一种基本的矩阵运算$A_{m \\times n} \\cdot B_{n \\times s} = C_{m \\times s}$。因此，`y`数据集里面样本数量是`n_samples`，即数据集的行数，因变量数量是`n_target`。\n",
    "\n",
    "由于Numpy的传播操作（broadcasting），`bias`虽然是标量，也会被增加到矩阵的每个元素上。增加噪声和数据混洗都很简单。这样试验用的回归数据集就完美了。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
